import { ReactNode } from 'react'
import { RouteComponentProps } from 'react-router'

export type Modify<T, R> = Omit<T, keyof R> & R

/** Api返回的统一结构 */
export interface IRes<T = any> {
  /** 业务响应码，200表示成功。 */
  code: number
  /** 业务数据 */
  data: T
  /** 消息内容，成功时为：success，失败时为错误消息 */
  msg: string | 'success'
  /** 响应时间戳 */
  ts: number
}

/** 列表页返回的统一结构 */
export interface IListRes<T = any> {
  content: T[]
  /** 当前页码 */
  number: number
  numberOfElements: number
  /** 每页大小 */
  size: number
  /** 总条数 */
  totalElements: number
  /** 总分页 */
  totalPages: number
}



/** 路由对象表 */
export interface IRoutes {

  _key?: string
  _home?: boolean
  _path?: string

  [key: string]: IRoutes | string | boolean
}

/** 路由项信息 */
export interface IRouteItem {
  /** 名称（可以为空，但值必须唯一）*/
  name?: string
  /** 访问路径，为空时会根据 file 自动生成。 */
  path?: string | string[]
  /** 控制权限的唯一标识 */
  customId?: string | string[]
  /**  */
  exact?: boolean
  /** 组件的文件路径，component和file必须传一个 */
  file?: string
  /** 组件
   * component优先于file
   * component和file必须传一个 
  */
  component?: React.ComponentType<RouteComponentProps<any>> | React.ComponentType<any>
  /** 
   * 直接使用Route
   * 设置后将忽略 path,exact,file,component,children 属性 
   * 设置后 name 将不会自动生成
  */
  route?: ReactNode
  /** 子路由 */
  children?: IRouteItem[]


}

export interface IMenuItem {
  /** Key，可使用customId */
  key: string
  /** 显示内容 */
  text: ReactNode
  /** 跳转路径 */
  path?: string
  /** 图标，string：antd icon name */
  icon?: string | ReactNode
  /** 子菜单 */
  children?: IMenuItem[],
  /** 关联其他路径 */
  relevantPaths?: (string | RegExp)[]
}

export interface IMenuRelevants {
  [customId: string]: (string | RegExp)[]
}


export interface IMenuExtraPath {
  [key: string]: (path: string) => string
}